/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */

package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.acts.Act;
import jp.ize.ux.acts.LayoutAct;
import jp.ize.ux.geom.UXPoint;
import jp.ize.ux.states.UXBasicState;
import jp.ize.ux.tween.easings.Expo;
// }}}
// {{{ class UXFreeLayoutCoState
class UXFreeLayoutCoState
{
	// {{{ public var focused(default, default) : Bool
	/**
	 * フォーカスが当たっているかどうかを取得、または設定します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * ハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXFreeLayoutExclusiveState
/**
 * UXLinearの各種状況を表現します。
 */
enum UXFreeLayoutExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXFreeLayoutCoState );
}
// }}}
// {{{ class UXFreeLayoutState extends UXBasicState
class UXFreeLayoutState extends UXBasicState
{
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		items = new Hash();
	}
	// }}}
	// {{{ public var background(default, default) : UXObject
	/**
	 * 背景となるオブジェクトです。デフォルトはnullです。
	 */
	public var background(default, default) : UXObject;
	// }}}
	// {{{ public var items( default, default) : Hash<UXObject>
	/**
	 * レイアウト対象のオブジェクトを保持します。
	 */
	public var items( default, default) : Hash<UXObject>;
	// }}}
}
// }}}

// {{{ class UXFreeLayoutBox extends UXComponent<UXFreeLayoutState>
/**
 * UXFreeLayoutクラス.<br>
 * Linearレイアウトと背景を持つコンポーネント。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXFreeLayoutBox extends UXComponent<UXFreeLayoutState>
{
	// {{{ public function new( points:Hash<UXPoint> ) : Void
	/**
	 * コンストラクタです。
	 *
	 * @param points: 名前付けされた座標の集合をハッシュにて指定します。
	 */
	public function new( points:Hash<UXPoint> ) : Void
	{
		state = new UXFreeLayoutState();
		state.target = this;
		ctrl = new UXController<UXFreeLayoutState>( state );
		super( ctrl );
		var a = new LayoutAct();
		var names:Array<String> = new Array();
		for ( key in points.keys() ) {
			names.push(key);
		}
		var param = {
			time: 0.5,
			transition: Expo.easeOut,
			names: names,
			points: points
		}
		ctrl.getInteraction("Layout").defaults.push(a.layout2(param));
		ctrl.getInteraction("Layout").setDefaultActs();
	}

	// }}}
	// {{{ public function setBackground( back : UXObject ) : Void
	/**
	 * 背景となるオブジェクトを設定できます。
	 */
	public function setBackground( back : UXObject ) : Void
	{
		//removeChild( _obj );
		//_obj = back;
		//addChild( _obj );
	}
	// }}}
	// {{{ public function add( name:String, c:UXObject ) : Void
	/**
	 * 引数として受け取った子オブジェクトを追加し、
	 * このコンポーネントの状態やコントーラーに反映させます。
	 */
	public function add( name:String, c:UXObject ) : Void
	{
		super.addUXChild( c );
		state.items.set( name, c );
	}
	// }}}
	// {{{ public function removeUXChild( c : UXObject ) : Void
	/**
	 * 引数として受け取った子オブジェクトを削除し、
	 * このコンポーネントの状態やコントローラーに反映させます。
	 */
	public function remove( name:String, c : UXObject ) : Void
	{
		super.removeUXChild(c);
		state.items.remove( name );
	}
	// }}}
	// {{{ public function update( updator : UXFreeLayoutState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXFreeLayoutState -> Void ) : Void
	{
		updator( state );
	}
	// }}}
}
// }}}
